package com.stone;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Picture;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.PictureDrawable;
import android.os.Bundle;
import android.view.View;
/**
 * 记录绘制的过程
 * 先在一个Picture中进行绘制，第一次和第二次使用这个记录的
 * picture进行绘制，第三次使用由Picture转换成的PictureDrawable进行绘制
 * 第四次将Picture转换成一个通用的流，然后在转回成Picture进行绘制。
 * picture是一个可以记录绘制过程的类，通常情况下
 * Android的绘制工作需要被绘制在Canvas上，但是通常只能显示的画布只有一个。
 * Picture的功能就是在于可以让绘制的东西绘制到一个虚拟的画布上，这个虚拟的
 * 画布由picture的beginRecording函数返回，pricture.draw(canvas)和canvas.drawpicture
 * 函数用于将一个记录好的绘制过程，重现在画布上。Picture绘制的内容也可以被
 * 记录到一个流当中，然后重新构造一个Picture。
 * */
public class PictureActivity extends Activity { 
   @Override
protected void onCreate(Bundle savedInstanceState) {
	// TODO Auto-generated method stub
	super.onCreate(savedInstanceState);
	setContentView(new MyView(this));
 }
   private static class MyView extends View{
    private Picture pic;
    private Drawable mDrawable;
    static void drawSomething(Canvas canvas){
    	 Paint p=new Paint(Paint.ANTI_ALIAS_FLAG);
    	 p.setColor(0x88FF0000);
    	 canvas.drawCircle(50, 50, 40, p);
    	 p.setColor(Color.GREEN);
    	 p.setTextSize(30);
    	 canvas.drawText("Pictures", 60, 60, p);
    }
    
	public MyView(Context context) {
		super(context);
	    setFocusable(true);
	    setFocusableInTouchMode(true);
	    pic=new Picture();
	    //开始录制
	    drawSomething(pic.beginRecording(200, 100));
	   //结束录制
	    pic.endRecording();
	    mDrawable=new PictureDrawable(pic);
	}
	 @Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		canvas.drawColor(Color.WHITE);
		//第一次绘制
		canvas.drawPicture(pic);
		//第二次绘制
		canvas.drawPicture(pic, new RectF(0,100,getWidth(),200));
	    //第三次绘制
		mDrawable.setBounds(0, 200,getWidth(), 300);
		mDrawable.draw(canvas);
		//第四次绘制
		ByteArrayOutputStream os=new ByteArrayOutputStream();
		pic.writeToStream(os);
		InputStream is=new ByteArrayInputStream(os.toByteArray());
		canvas.translate(0, 300);
		canvas.drawPicture(Picture.createFromStream(is));
	}  
   }
}
